Let's make an oscillator that slows down as it goes through the cycle
In [47]:
import nengo
import numpy as np
model = nengo.Network()
model.config[nengo.Ensemble].neuron_type=nengo.LIFRate()
with model:
T = 10.0
def stim_func(t):
if 0 < t % T < 0.05:
return 10
return 0
stim = nengo.Node(stim_func)
a = nengo.Ensemble(n_neurons=1000, dimensions=2, intercepts=nengo.dists.Uniform(0.3,0.3))
nengo.Connection(stim, a[0])
def temporal(x):
theta = np.arctan2(x[1], x[0])
r = np.sqrt(x[0]**2+x[1]**2)
if theta < 0:
theta += np.pi*2
scale = 0.5
e_theta = np.exp(scale*theta)
e_theta += 0.15
theta = np.log(e_theta)/scale
return r*np.cos(theta), r*np.sin(theta)
nengo.Connection(a, a, function=temporal, synapse=0.1)
p_spikes = nengo.Probe(a.neurons)
p_value = nengo.Probe(a, synapse=0.03)
In [48]:
sim = nengo.Simulator(model)
with sim:
sim.run(10)
In [49]:
%matplotlib inline
import pylab
Here's what the represented value looks like over time
In [50]:
pylab.plot(sim.trange(), sim.data[p_value]);
And here are the temporal tuning curves
In [51]:
pylab.plot(sim.trange()-0.05, sim.data[p_spikes][:,:30])
pylab.xlim(0, T)
pylab.show()
If we sort these neurons by where their peak is, we find that about half the neurons have peaks, and we get a nice gradual spread of the representation.
In [52]:
peaks = np.argmax(sim.data[p_spikes], axis=0)
order = np.argsort(peaks)
s = sim.data[p_spikes]
s = s[:,order]
pylab.imshow(s.T, aspect='auto')
pylab.show()
In [ ]:
In [ ]: